package user_api

import (
	"github.com/gin-gonic/gin"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/res"
	"giv-vue-blog/utils/jwts"
	"giv-vue-blog/utils/pwd"
)

type UpdatePwdRequest struct {
	OldPwd   string `json:"old_pwd" binding:"required" msg:"输入旧密码"`           //旧密码
	Password string `json:"password" binding:"required,password" msg:"输入新密码"` //新密码
}

// UserUpdatePwdView 修改用户密码接口
// @Summary 修改用户密码
// @Description 修改登录用户的密码，需要提供旧密码和新密码
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param cr body UpdatePwdRequest true "修改密码请求参数"
// @Security Bearer
// @Router /api/user_pwd [post]
// @Success 200 {string} string "密码修改成功"
// @Failure 400 {object} res.Response "请求参数错误"
// @Failure 401 {object} res.Response "未授权访问"
// @Failure 404 {object} res.Response "用户不存在"
// @Failure 500 {object} res.Response "服务器内部错误"
// UserUpdatePwdView 修改登录人的密码
func (UserApi) UserUpdatePwdView(c *gin.Context) {
	_claims, _ := c.Get("claims")
	claims := _claims.(*jwts.CustomClaims)
	var cr UpdatePwdRequest
	if err := c.ShouldBindJSON(&cr); err != nil {
		res.FailedWithError(err, &cr, c)
		return
	}
	//拿到对应的用户id进行修改
	var user models.UserModel
	err := global.DB.Take(&user, claims.UserID).Error
	if err != nil {
		res.FailedWithMsg("用户不存在", c)
		return
	}
	//判断输入的老密码是否正确
	if !pwd.CheckPwd(user.Password, cr.OldPwd) {
		res.FailedWithMsg("旧密码输入错误", c)
		return
	}
	if cr.Password != cr.OldPwd {
		hashPwd := pwd.HashAndSalt(cr.Password)
		err = global.DB.Model(&user).Update("password", hashPwd).Error
		if err != nil {
			global.Log.Error(err)
			res.FailedWithMsg("密码修改失败", c)
			return
		}
		res.OkWithMsg("密码修改成功", c)
		return
	} else {
		res.FailedWithMsg("新密码不能与上次的密码一致", c)
		return
	}
}
